package mx.unam.acatlan.poo.objetos.geometricos;

/**
 * 
 * Un cuadrado en el plano.
 * 
 * Un modelo de un cuadrado en el plano que puede ser trasladado. La posicion
 * del cuadrado su vertice superior izquierdo.
 * 
 * @author "Carlos Alegria Galicia"
 *
 */
public class Cuadrado {
	
	/**
	 * El punto de referencia del cuadrado
	 */
	private Punto punto;
	
	/**
	 * La longitud del lado del cuadrado
	 */
	private int longitud;
	
	/**
	 * Crea un cuadrado con sus lados iguales a la longitud especificada,
	 * localizado en el origen del sistema coordenado. 
	 * 
	 * @param longitud La longitud de los lados del cuadrado
	 */
	public Cuadrado(int longitud) {
		
		// al sobrecargar metodos, se recomienda reutilizar codigo lo mas
		// que se pueda. En este caso, la palabra clave "this" nos permite
		// reutilizar el codigo del constructor con la firma
		// Cuadrado(Punto punto, int longitud) 
		//
		this(new Punto(0, 0), longitud);
	}
	
	/**
	 * Crea un cuadrado con sus lados iguales a la longitud especificada,
	 * localizado en el punto especificado.
	 * 
	 * @param punto
	 * @param longitud
	 */
	public Cuadrado(Punto punto, int longitud) {
		this.punto = punto;
		this.longitud = longitud;
	}
	
	/**
	 * Regresa la posicion actual del cuadrado
	 * 
	 * @return El punto de referencia que representa la posicion actual del
	 *         cuadrado
	 */
	public Punto getPosicion() {
		
		// al crear un nuevo punto evitamos que el codigo cliente modifique el
		// punto que estamos utilizando sin que podamos garantizar la
		// consistencia de los datos
		//
		Punto punto = new Punto(this.punto.getX(), this.punto.getY());
		return punto;
	}
	
	/**
	 * Calcula el area del cuadrado
	 * 
	 * @return El area del cuadrado
	 */
	public int getArea() {
		return (int) Math.round(Math.pow(this.longitud, 2));
	}
	
	/**
	 * Calcula el perimeto del cuadrado
	 * 
	 * @return El perimetro del cuadrado
	 */
	public int getPerimetro() {
		return this.longitud * 4;
	}
}
